//
// Created by tang on 3/10/23.
//

#ifndef PLUGIN_INTERFACE_HPP
#define PLUGIN_INTERFACE_HPP

#include "sdk_config.h"
#include "core/timespan.hpp"

class ImageContent;
class ui_view;

struct PluginInfo {
    // version info
    union {
        u32 version_code;
        struct { // low -> high
            u32 version_patch:16;
            u32 version_minor:8;
            u32 version_major:8;
        };
    };

    // 作者
    const char *author;

    // 简要描述
    const char *brief;

    // 详细信息
    const char *detail;

    // 版本信息
    const char *src_info;
};

#define MAKE_VERSION(x,y,z) ((u32)((x)<<24) | (u32)((y)<<16) | (u32)(z))

/**
 * 插件基类
 */
class PI_API IPlugin {
public:
    virtual ~IPlugin();

    /***
     * 获取此插件的信息
     * @return 插件信息
     */
    virtual const PluginInfo *get_plugin_info() const = 0;

    /***
     * 初始化插件
     * @return 是否成功
     */
    virtual bool initialize() = 0;

    /**
     * 插件更新
     * @param delta 距离上次更新多少时间间隔
     * @param total 累计运行时间
     */
    virtual void tick(pi_time_t delta, pi_time_t total) = 0;

    /**
     * 清理插件的资源
     */
    virtual void cleanup() = 0;

    /**
     * 获取插件的名称（显示）
     * @return 名称
     */
    [[nodiscard]] virtual const char* name() const = 0;

    /**
     * 获取插件图标
     * @return
     */
    [[nodiscard]] virtual const ImageContent *icon() const = 0;

    /**
     * 获取界面视图
     * @return 界面视图
     */
    [[nodiscard]] virtual ui_view* content() const = 0;
};

#endif // PLUGIN_INTERFACE_HPP
